package LeetCodeTest.PrimaryAlgorithmTest.LinkList;

public class DeleteNode {
    /**
     * 删除链表中的节点
     * 请编写一个函数，用于 删除单链表中某个特定节点 。在设计函数时需要注意，你无法访问链表的头节点 head ，只能直接访问 要被删除的节点 。
     * 题目数据保证需要删除的节点 不是末尾节点 。
     *
     * 示例 1：
     * 输入：head = [4,5,1,9], node = 5
     * 输出：[4,1,9]
     * 解释：指定链表中值为 5 的第二个节点，那么在调用了你的函数之后，该链表应变为 4 -> 1 -> 9
     *
     * 示例 2：
     * 输入：head = [4,5,1,9], node = 1
     * 输出：[4,5,9]
     * 解释：指定链表中值为 1 的第三个节点，那么在调用了你的函数之后，该链表应变为 4 -> 5 -> 9
     *
     * 示例 3：
     * 输入：head = [1,2,3,4], node = 3
     * 输出：[1,2,4]
     *
     * 示例 4：
     * 输入：head = [0,1], node = 0
     * 输出：[1]
     *
     * 示例 5：
     * 输入：head = [-3,5,-99], node = -3
     * 输出：[5,-99]
     * 提示：
     * 链表中节点的数目范围是 [2, 1000]
     * -1000 <= Node.val <= 1000
     * 链表中每个节点的值都是唯一的
     * 需要删除的节点 node 是 链表中的一个有效节点 ，且 不是末尾节点
     *
     * 作者：力扣 (LeetCode)
     * 链接：https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnarn7/
     * 来源：力扣（LeetCode）
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     */
    public static void main(String[] args) {
        DeleteNode deleteNode = new DeleteNode();
        ListNode node0 = new ListNode(0);
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        ListNode node4 = new ListNode(4);
        ListNode node5 = new ListNode(5);
        ListNode node6 = new ListNode(6);
        node0.next = node1;
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        node5.next = node6;
        deleteNode.deleteNode(node3);
        System.out.println(node0.val);
        System.out.println(node0.next.val);
        System.out.println(node0.next.next.val);
        System.out.println(node0.next.next.next.val);
        System.out.println(node0.next.next.next.next.val);


    }

    /**
     * 思路：因为是单链表，无法获取前一个 node 的信息通过常规方式来修改。所以讲下一个node的B值赋给需要删除的node A，然后将A指向B的下一个对象
     * @param node
     */
    public void deleteNode(ListNode node) {
        //把要删除结点的下一个结点的值赋给要删除的结点
        node.val = node.next.val;
        //然后删除下一个结点
        node.next = node.next.next;
    }
}
